package com.itcz.maker.template;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import com.itcz.maker.template.enums.FileFilterRangeEnum;
import com.itcz.maker.template.enums.FileFilterRuleEnum;
import com.itcz.maker.template.model.FileFilterConfig;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class FileFilter {

    public static List<File> doFilter(List<FileFilterConfig> fileFilterConfigList, String filePath) {
        // 根据路径获取所有文件
        List<File> files = FileUtil.loopFiles(filePath);
//        List<File> fileList = new ArrayList<>();
//        for (File file : files) {
//            if(doSingleFileFilter(fileFilterConfigList, file)) {
//                fileList.add(file);
//            }
//        }
//        return fileList;
        // 与以上注释代码功能一致
        // filter()：根据传入参数保留集合中元素，true则保留，false则舍弃
        // collect():将所有集合中元素采用方法中的参数收集成某个对象
        // Collectors.toList():将所有元素转成List集合中的元素
        return files.stream()
                .filter(file -> doSingleFileFilter(fileFilterConfigList, file))
                .collect(Collectors.toList());
    }


    /**
     * 根据传入的文件过滤配置集合校验单个文件
     * @param fileFilterConfigList
     * @param file
     * @return
     */
    private static boolean doSingleFileFilter(List<FileFilterConfig> fileFilterConfigList, File file) {
        String fileName = file.getName();
        String fileContent = FileUtil.readUtf8String(file);

        if(CollUtil.isEmpty(fileFilterConfigList)) {
            return true;
        }

        // 所有校验器校验结束后的结果
        boolean result = true;

        for (FileFilterConfig fileFilterConfig : fileFilterConfigList) {
            String range = fileFilterConfig.getRange();
            String rule = fileFilterConfig.getRule();
            String value = fileFilterConfig.getValue();

            // 根据range得到对应的枚举值
            FileFilterRangeEnum filterRangeEnum = FileFilterRangeEnum.getEnumByValue(range);
            if(filterRangeEnum == null) {
                return true;
            }

            // 要校验的内容
            String content = fileName;
            switch (filterRangeEnum) {
                case FILE_NAME:
                    content = fileName;
                    break;
                case FILE_CONTENT:
                    content = fileContent;
                    break;
                default:
            }

            // 根据rule得到对应的枚举类型
            FileFilterRuleEnum fileFilterRuleEnum = FileFilterRuleEnum.getEnumByValue(rule);
            if(fileFilterRuleEnum == null) {
                return true;
            }

            // 根据枚举类型执行对校验的内容执行对应的校验
            switch (fileFilterRuleEnum) {
                case CONTAINS:
                    result = content.contains(value);
                    break;
                case STARTS_WITH:
                    result = content.startsWith(value);
                    break;
                case ENDS_WITH:
                    result = content.endsWith(value);
                    break;
                case REGEX:
                    result = content.matches(value);
                    break;
                case EQUALS:
                    result = content.equals(value);
                    break;
            }

            // 只要有一个校验器不通过，则直接返回
            if(!result) {
                return false;
            }
        }

        // 都校验成功
        return true;
    }

}
